package com.success.course.service.impl;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.success.course.domain.CourseType;
import com.success.course.mapper.CourseTypeMapper;
import com.success.course.service.ICourseTypeService;
import com.success.hrm.feignclients.RedisFeignClient;
import com.success.hrm.util.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author wolf
 * @since 2020-02-21
 */
@Service
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    /*@Autowired   //没必要写这个
    private CourseTypeMapper courseTypeMapper;*/
    /**
     *  * <p>
     *  * 课程目录 服务实现类
     *  * </p>
     * 这里写树状业务
     * @return
     */
        //改整合redis
    @Autowired   //在启动类上打上标签就能获取成功
    private RedisFeignClient redisFeignClient;


    /**
     *然后就是当修改添加删除的时候跟新redis
     * @return
     */
    @Override
    public boolean insert(CourseType entity) {

        boolean insertSuccess = super.insert(entity);

        //重置Redis
        //查询mysql中的课程分类
        //把课程分类放到Redeis
        resetRedisForCourseType();

        return insertSuccess;
    }

    @Override
    public boolean deleteById(Serializable id) {
        boolean deleteSuccess = super.deleteById(id);
        //重置Redis
        //查询mysql中的课程分类
        //把课程分类放到Redeis
        resetRedisForCourseType();

        return deleteSuccess;
    }

    @Override
    public boolean updateById(CourseType entity) {
        boolean updateSuccess = super.updateById(entity);
        //重置Redis
        //查询mysql中的课程分类
        //把课程分类放到Redeis
        resetRedisForCourseType();

        return updateSuccess;
    }
    //提取了查询数据库
    public List<CourseType> resetRedisForCourseType(){
        List<CourseType> courseTypes = baseMapper.selectList(null);

        AjaxResult courseType = redisFeignClient.set("courseType", JSON.toJSONString(courseTypes));
        return courseTypes;
    }

    //使用redis思路

    /**
     * 先去redis获取，
     * 如果有直接返回
     *  如果没有就从数据库获取  并保存一份到redis
     * @return
     */
    //第一步查询redis
    public List<CourseType> redis(){

        AjaxResult ajax = redisFeignClient.get("courseType");
        if (ajax.getResultObj()!= null && ajax.isSuccess()){
            String s = ajax.getResultObj().toString();
            List<CourseType> courseTypes = JSON.parseArray(s, CourseType.class);
            return courseTypes;
        }else{
            List<CourseType> courseTypes = resetRedisForCourseType();
            return courseTypes;
        }
    }
    @Override
    public List<CourseType> treeData() {
        List<CourseType> courseTypes = redis();
        //开始这样的但是是集合所有这样不行
        //CourseType course = new CourseType();
        List<CourseType> courses = new ArrayList<>();
        //查询出所有课程
        //List<CourseType>  courseTypes= baseMapper.selectList(null);
        //然后处理  处理思路儿子找父亲
        //1.先找到所有的父

        for (CourseType courseType : courseTypes) {
            if (courseType.getPid().longValue()==0){
                //这是全部的父
                courses.add(courseType);  //这里整合了全部的父类
            }else{
                //这里面子找父
                //思路是    1.这里拿到一个不是一级父的数据 2.把这个数据在所有数据中找出他的父类
                CourseType courseType1 = null;
                //这里就是再次循环所有数据
                for (CourseType type : courseTypes) {
                    //这里找出对于的父  在type中找出Id 和最外面循环的pid相同
                    if (type.getId().longValue() == courseType.getPid().longValue()){
                        //然后把儿子存起来
                        courseType1 = type;
                        //并结束掉本次循环
                        break;
                    }
                }
                //让后把数据存在对于的父中   还得判断一下是不是空
                if (courseType1 != null){
                    courseType1.getCourses().add(courseType);
                }
            }
        }
        return courses;
    }

}
